#
# This playbook lets you safely reboot a virthost and all it's guests. 
# 
# requires --extra-vars="target=somevhost fqdn"

#General overview:
# talk to the vhost
# get back list of instances
# add each of their hostnames to an addhoc group
# halt each of them in a second play
# wait for them to die
# third play, reboot the vhost
#     wait for vhost to come back

# TODO: Figure out how to compare virt info pre and post boot. 

- name: find instances
  hosts: "{{ target }}"
  gather_facts: False
  user: root

  tasks:
  - name: get list of guests
    virt: command=list_vms
    register: vmlist

#  - name: get info on guests (prereboot)
#    virt: command=info
#    register: vminfo_pre

  - name: add them to myvms_new group
    local_action: add_host hostname={{ item }} groupname=myvms_new
    with_items: vmlist.list_vms

- name: halt instances
  hosts: myvms_new
  user: root
  gather_facts: False
  serial: 1

  tasks:
  - name: schedule regular host downtime
    nagios: action=downtime minutes=30 service=host host={{ inventory_hostname_short }}
    delegate_to: noc01.phx2.fedoraproject.org
    ignore_errors: true
    when: inventory_hostname.find('.stg.') == -1

  - name: schedule stg host downtime
    nagios: action=downtime minutes=30 service=host host={{ inventory_hostname_short }}.stg
    delegate_to: noc01.phx2.fedoraproject.org
    ignore_errors: true
    when: inventory_hostname.find('.stg.') != -1

  - name: halt the vm instances - to poweroff
    command: /sbin/shutdown -h 1
    ignore_errors: true
    # if one of them is down we don't care

- name: wait for the whole set to die.
  hosts: myvms_new
  gather_facts: False
  user: root

  tasks:
  - name: wait for them to die
    local_action: wait_for port=22 delay=30 timeout=300 state=stopped host={{ inventory_hostname }}

- name: reboot vhost
  hosts: "{{ target }}"
  gather_facts: False
  user: root

  tasks:
  - name: tell nagios to shush
    nagios: action=downtime minutes=60 service=host host={{ inventory_hostname }}
    delegate_to: noc01.phx2.fedoraproject.org
    ignore_errors: true

  - name: reboot the virthost
    command: /sbin/shutdown -r 1

  - name: wait for virthost to come back - up to 15 minutes
    local_action: wait_for host={{ target }} port=22 delay=120 timeout=900 search_regex=OpenSSH

  - name: wait for libvirtd to come back on the virthost
    wait_for: path=/var/run/libvirtd.pid state=present delay=10

  - name: look up vmlist
    virt: command=list_vms
    register: newvmlist

  - name: sync time
    command: ntpdate -u 66.187.233.4

  - name: serverbeach hosts need a special iptables config
    command: /root/fix-iptables.sh
    when: inventory_hostname_short.startswith('serverbeach')

  - name: tell nagios to unshush
    nagios: action=unsilence service=host host={{ inventory_hostname }}
    delegate_to: noc01.phx2.fedoraproject.org
    ignore_errors: true

- name: Fix unbound if necessary
  # intersection - hosts that are in our dynamic group and also in unbound-dns
  hosts: "myvms_new:&unbound"
  user: root

  vars_files:
   - /srv/web/infra/ansible/vars/global.yml
   - /srv/web/infra/ansible/vars/{{ ansible_distribution }}.yml

  tasks:
  - include: "{{ tasks }}/restart_unbound.yml"

#  - name: get info on guests (postreboot)
#    virt: command=info
#    register: vminfo_post

